﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.X509RecipientIdentity
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using Microsoft.InfoCards.Diagnostics;
using System;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;

namespace Microsoft.InfoCards
{
  internal class X509RecipientIdentity : RecipientIdentity
  {
    private X509Certificate2Collection m_certificates;
    private Recipient.RecipientCertParameters m_recipientParams;
    private bool isChainTrusted;

    public Recipient.RecipientCertParameters RecipientParams
    {
      get
      {
        return this.m_recipientParams;
      }
    }

    public X509Certificate2 LeafCertificate
    {
      get
      {
        return this.m_certificates[0];
      }
    }

    public X509RecipientIdentity(EndpointAddress epr, X509Certificate2Collection certificates)
      : base(epr)
    {
      this.m_certificates = certificates;
    }

    public override void Validate()
    {
      if (this.HasBeenValidated)
        return;
      this.isChainTrusted = this.ValidateCertificate();
      this.Identifier = Recipient.CertGetRecipientIdHash(this.LeafCertificate, this.m_certificates, this.isChainTrusted, out this.m_recipientParams);
      this.OrganizationIdentifier = Recipient.CertGetRecipientOrganizationIdHash(this.LeafCertificate, this.m_certificates, this.ValidateCertificate());
      this.OrganizationPPIDIdentifier = Recipient.CertGetRecipientOrganizationPPIDSeedHash(this.LeafCertificate, this.m_certificates, this.ValidateCertificate());
      this.HasBeenValidated = true;
    }

    public override string GetName()
    {
      string str = this.LeafCertificate.FriendlyName;
      if (string.IsNullOrEmpty(str))
        str = this.LeafCertificate.GetNameInfo(X509NameType.SimpleName, false);
      return str;
    }

    private bool ValidateCertificate()
    {
      bool chainTrustPassed = false;
      try
      {
        InfoCardX509Validator.ValidateChainOrPeer(this.LeafCertificate, this.m_certificates, out chainTrustPassed);
      }
      catch (SecurityTokenValidationException ex)
      {
        throw InfoCardTrace.ThrowHelperError((Exception) new IdentityValidationException(SR.GetString("RecipientCertificateNotValid"), (Exception) ex));
      }
      return chainTrustPassed;
    }
  }
}
